package br.com.pontoe.model.persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

import br.com.pontoe.model.conexao.Conexao;
import br.com.pontoe.model.entidades.Funcionario;
import br.com.pontoe.model.entidades.Usuario;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

/**
 * DAO para a entidade Funcionario
 * 
 * @author Cleison
 * @version 1.0
 * @since 09/05/2010
 */
public class FuncionarioDAO implements DAOInterface<Funcionario> {
	
	private StringBuilder sql = new StringBuilder();
	private Connection con = null;
	private PreparedStatement stm = null;

	
	@Override
	public int adicionar(Funcionario entidade) throws SQLException {
		int ret = -1;

		try {
			sql = new StringBuilder();
			sql.append("INSERT INTO FUNCIONARIO (IDFUNCIONARIO, MATRICULA, IDDEPARTAMENTO, IDCARGO) ");
			sql.append("VALUES (NULL, ?, ?, ?) ");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());

			stm.setInt(1, entidade.getMatricula());
			stm.setInt(2, entidade.getDepartamento().getId());
			stm.setInt(3, entidade.getCargo().getId());

			stm.executeUpdate();
			ret=(int)stm.getLastInsertID();
		} 
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	@Override
	public boolean atualizar(Funcionario entidade) throws SQLException {
		boolean ret = true;

		try {
			sql = new StringBuilder();
			sql.append("UPDATE FUNCIONARIO ");
			sql.append("SET    MATRICULA = ?, IDDEPARTAMENTO = ?, IDCARGO = ? ");
			sql.append("WHERE  IDFUNCIONARIO = ? ");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());

			stm.setInt(1, entidade.getMatricula());
			stm.setInt(2, entidade.getDepartamento().getId());
			stm.setInt(3, entidade.getCargo().getId());
			stm.setInt(4, entidade.getId());

			ret = stm.execute();
		} 
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	@Override
	public Funcionario localizar(int id) throws SQLException {
		Funcionario ret = null;

		try {
			sql = new StringBuilder();
			sql.append("SELECT 	IDFUNCIONARIO, MATRICULA, IDDEPARTAMENTO, IDCARGO ");
			sql.append("FROM 	FUNCIONARIO ");
			sql.append("WHERE 	IDFUNCIONARIO = ? ");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());
			
			stm.setInt(1, id);

			ResultSet temp = stm.executeQuery();
			UsuarioDAO uTmp = new UsuarioDAO();
			DepartamentoDAO dTmp = new DepartamentoDAO();
			CargoDAO cTmp = new CargoDAO();
			
			if (temp.next()) {
				ret = new Funcionario();
				ret.setId(temp.getInt("IDFUNCIONARIO"));
				
				//Recupera os dados da classe pai (Usuario)
				Usuario u = uTmp.localizar(temp.getInt("MATRICULA"));
				ret.setMatricula(u.getMatricula());
				ret.setNome(u.getNome());
				ret.setNascimento(u.getNascimento());
				ret.setTelefone(u.getTelefone());
				ret.setSenha(u.getSenha());
				ret.setEndereco(u.getEndereco());

				//Recupera departamento e cargo
				ret.setDepartamento(dTmp.localizar(temp.getInt("IDDEPARTAMENTO")));
				ret.setCargo(cTmp.localizar(temp.getInt("IDCARGO")));
			}
			temp.close();
		} 
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}
	
	@Override
	public boolean remover(Funcionario entidade) throws SQLException {
		boolean ret = true;

		try {
			sql = new StringBuilder();
			sql.append("DELETE FROM FUNCIONARIO ");
			sql.append("WHERE  IDFUNCIONARIO = ? ");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());
			
			stm.setInt(1, entidade.getId());
			
			ret = stm.execute();
		} 
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}
	

	@Override
	public List<Funcionario> localizarTodos() throws SQLException {
		List<Funcionario> ret = new ArrayList<Funcionario>();

		try {
			sql = new StringBuilder();
			sql.append("SELECT 	IDFUNCIONARIO, MATRICULA, IDDEPARTAMENTO, IDCARGO ");
			sql.append("FROM 	FUNCIONARIO ");
			

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());
			
			

			ResultSet temp = stm.executeQuery();
			UsuarioDAO uTmp = new UsuarioDAO();
			DepartamentoDAO dTmp = new DepartamentoDAO();
			CargoDAO cTmp = new CargoDAO();
			
			while(temp.next()) {
				Funcionario f = new Funcionario();
				f.setId(temp.getInt("IDFUNCIONARIO"));
				
				//Recupera os dados da classe pai (Usuario)
				Usuario u = uTmp.localizar(temp.getInt("MATRICULA"));
				f.setMatricula(u.getMatricula());
				f.setNome(u.getNome());
				f.setNascimento(u.getNascimento());
				f.setTelefone(u.getTelefone());
				f.setSenha(u.getSenha());
				f.setEndereco(u.getEndereco());

				//Recupera departamento e cargo
				f.setDepartamento(dTmp.localizar(temp.getInt("IDDEPARTAMENTO")));
				f.setCargo(cTmp.localizar(temp.getInt("IDCARGO")));
				
				ret.add(f);
			}
			temp.close();
		} 
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	/**
	 * metodo add rodolfo
	 * 
	 * @author Rodolfo
	 * @version 1.1
	 * @throws ParseException 
	 * @since 17/05/2010
	 */
	public Funcionario localizarMatri(int matricula) throws SQLException {
		Funcionario ret = null;

		try {
			sql = new StringBuilder();
			sql.append("SELECT 	IDFUNCIONARIO, MATRICULA, IDDEPARTAMENTO, IDCARGO ");
			sql.append("FROM 	FUNCIONARIO ");
			sql.append("WHERE 	MATRICULA = ? ");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());
			
			stm.setInt(1, matricula);

			ResultSet temp = stm.executeQuery();
			UsuarioDAO uTmp = new UsuarioDAO();
			DepartamentoDAO dTmp = new DepartamentoDAO();
			CargoDAO cTmp = new CargoDAO();
			
			if (temp.next()) {
				ret = new Funcionario();
				ret.setId(temp.getInt("IDFUNCIONARIO"));
				
				//Recupera os dados da classe pai (Usuario)
				Usuario u = uTmp.localizar(temp.getInt("MATRICULA"));
				ret.setMatricula(u.getMatricula());
				ret.setNome(u.getNome());
				ret.setNascimento(u.getNascimento());
				ret.setTelefone(u.getTelefone());
				ret.setSenha(u.getSenha());
				ret.setEndereco(u.getEndereco());

				//Recupera departamento e cargo
				ret.setDepartamento(dTmp.localizar(temp.getInt("IDDEPARTAMENTO")));
				ret.setCargo(cTmp.localizar(temp.getInt("IDCARGO")));
			}
			temp.close();
		} 
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	
	

			

}
